home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / FuncEnemy / zako04.c < prev    next >
C/C++ Source or Header  |  1999-06-14  |  4KB  |  164 lines

  1. /* ザコ4 */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../otoko.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../priority.h"
  10. #include "../sound.h"
  11. #include "../psearch.h"
  12.  
  13. #define PALET_MAIN    0x0600
  14. #define wabs(x) ((x) >= 0 ? (short) (x) : (short) -(x))
  15. #define abs(x)  ((x) >= 0 ? (int) (x) : (int) -(x))
  16.  
  17.  
  18. static short points_disp;    /* 得点を表示するか */
  19.  
  20. static short EnemyMoveZako04 (ENEMY *);
  21. static void EnemyTiniZako04 (ENEMY *);
  22.  
  23.  
  24. /* ゲーム開始時に1回だけ呼ばれる */
  25. void EnemyInitStaticZako04 (void)
  26. {
  27.     points_disp = 0;
  28. }
  29.  
  30.  
  31. void EnemyInitZako04 (ENEMY * p)
  32. {
  33.     p->vx = 16384;
  34.     p->vy = 4 * 65536;
  35.     p->hit_px = 8;
  36.     p->hit_py = 12;
  37.     p->hit_sx = 12;
  38.     p->hit_sy = 12;
  39.     p->hit_cx = 4;
  40.     p->damage = p->damage_core = 0;
  41.     p->hp = 1;
  42.     p->seq = 0;
  43.     p->m_work2 = 0;
  44.     p->work2 = 0;
  45.     p->work4 = 0;        /* 1回接近したか */
  46.     p->angle = 64;
  47.     p->pt = obj_zako04 + ((p->angle) >> 3);
  48.     p->info = PALET_MAIN | PRIORITY_ZAKO;
  49.     p->core_pt = sp_core01 + 1;
  50.     p->core_info = PALET_CORE_BLUE | PRIORITY_ZAKO;
  51.     p->func_enemy_move = EnemyMoveZako04;
  52.     p->func_enemy_tini = EnemyTiniZako04;
  53. }
  54.  
  55.  
  56.  
  57. static short EnemyMoveZako04 (ENEMY * p)
  58. {
  59.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  60.     p->x = (p->lx += p->vx) >> 16;
  61.     p->y = (p->ly += p->vy) >> 16;
  62.  
  63.     switch (p->seq) {
  64.     case 0:        /* まず突っ込んでくる */
  65.         /* ある程度進んだか自機に近付いたら減速 */
  66.         if ((p->m_work2++ > 45) || (p->y > player->y - 32))
  67.             p->seq++;
  68.         break;
  69.     case 1:        /* 減速 */
  70.         p->vy -= 16384;
  71.         if (SHORT_VY < 1) {
  72.             p->seq++;
  73.             p->work2 = 0;
  74.             p->s_work2 = 0;
  75.             p->core_info = PALET_CORE_RED | PRIORITY_ZAKO;    /* コア赤くなる */
  76.         }
  77.         break;
  78.  
  79.         /* 直線運動しつつこちらを向く */
  80.     case 2:
  81.         /* 移動処理 */
  82.         p->vy -= 512;
  83.         if (SHORT_VY < 0)
  84.             p->seq++;
  85.  
  86.         if (p->work2++ > 4) {
  87.             p->work2 = 0;
  88.             /* 自機の方を向く */
  89.             if ((unsigned char) (p->angle - psearch (p->x, p->y)) > (unsigned char) 128)
  90.                 p->angle += 4;
  91.             else
  92.                 p->angle -= 4;
  93.  
  94.             p->pt = obj_zako04 + ((p->angle) >> 3);
  95.         }
  96.         /* 攻撃処理 */
  97. #define INTERVAL2    30
  98. #define SPEED_SHOT    15
  99.         if (p->s_work2++ > INTERVAL2) {
  100.             p->s_work2 = 0;
  101.             EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT, p->angle, 0);
  102.             SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  103.         }
  104.         break;
  105.  
  106.         /* 撤退 */
  107.     case 3:
  108.         if (SHORT_VY > -3)
  109.             p->vy -= 4096;
  110.  
  111.         if ((p->angle > 192 - 4) && (p->angle < 192 + 4)) {
  112.             p->angle = 192;
  113.         } else {
  114.             /* 上を向く */
  115.             if ((unsigned char) (p->angle - 192) > (unsigned char) 128)
  116.                 p->angle += 4;
  117.             else
  118.                 p->angle -= 4;
  119.         }
  120.         p->pt = obj_zako04 + ((p->angle) >> 3);
  121.         /* 画面外に出たら消去 */
  122.         if (p->y < -32)
  123.             return (-1);    /* 消去 */
  124.         break;
  125.     default:
  126.         break;
  127.     }
  128.  
  129.  
  130.     /* 自機ショットに当たった時の処理 */
  131.     /* ザコは一撃で死ぬのでコア云々は考慮しなくて良い */
  132.     if (p->damage) {
  133.         EffectInit (EFFECT_EXPLZAKO, 0, p->x, p->y);
  134.         SoundSetSE (SE_EXPL);
  135.         if (points_disp < ZAKO_SCORE_DISP) {
  136.             points_disp++;
  137.             if (p->core_info == (PALET_CORE_RED | PRIORITY_ZAKO))
  138.                 EffectInit (EFFECT_POINTS_RED, POINTS_300, p->x, p->y);
  139.             else
  140.                 EffectInit (EFFECT_POINTS_BLUE, POINTS_200, p->x, p->y);
  141.         } else {
  142.             if (p->core_info == (PALET_CORE_RED | PRIORITY_ZAKO))
  143.                 EffectInit (EFFECT_POINTS, POINTS_300, p->x, p->y);
  144.             else
  145.                 EffectInit (EFFECT_POINTS, POINTS_200, p->x, p->y);
  146.         }
  147.         return (-1);    /* 消去 */
  148.     }
  149.     xobj_set_st (p);
  150.  
  151.     /* コアの表示 */
  152.     p->core_x = p->x - 8;
  153.     p->core_y = p->y - 8;
  154.     xsp_set_st (&(p->core_x));
  155.  
  156.     return (0);
  157. }
  158.  
  159.  
  160.  
  161. static void EnemyTiniZako04 (ENEMY * p)
  162. {
  163. }
  164.